function res = GetMagnetometerSensitivity(obj, varargin)
    p=inputParser;
    p.addParameter('nCol', 1024, @(x) x>0);
    p.addParameter('average', 100, @(x) x>0);
    p.addParameter('signal_frequency', 30.0, @(x) x>0 && x < 100);
    p.addParameter('signal_amplitude', 0.02, @(x) x>0 && x < 0.1);
    p.addParameter('isReport', false, @islogical);
    p.addParameter('description', 'normal', @ischar);
    p.parse(varargin{:});
    
    %%
    V2nT = obj.bx.setting.volt2curr * obj.bx.setting.curr2nT; % control voltage [V] to actual field [nT]
    slope = obj.SystemInfo.WorkingPoint.slopeX; % control voltage [V] to signal amplitude [V]
    coeff = abs(slope/V2nT); % [V/nT] signal amplitude generated by 1nT transverse field in x direction
    
    %%
    obj.setParametricMagnetometer('isLockTransverseField', true);
    obj.bx.setAC('frequency', p.Results.signal_frequency, 'amplitude', p.Results.signal_amplitude);
    
    %%
    obj.bTrans.unsubscribe_signal();
    obj.bTrans.subscribe_signal(ziDemodSpectrum.X_fft_abs_avg);
    spectrum = obj.bTrans.getDemodSpectrum(p.Results.nCol, 'average', p.Results.average, 'fSpan', obj.bTrans.getSetting('bandwidth'));
    fitting = obj.FitMagnetometerSensitivity(spectrum, coeff);
    
    obj.bx.disable();

    %%
    res.timestamp = datetime('now');
    res.signal = spectrum;    
    res.fitting = fitting;
    res.parameter.amplitude = p.Results.signal_amplitude * V2nT;
    res.parameter.frequency = p.Results.signal_frequency;
    res.psdBackground = fitting.meanSensitivity;
    obj.SystemInfo.MagnetometorSensitivity = res;
    
    fig = obj.PlotMagnetometerSensitivity();
    
    %%
    if p.Results.isReport
        getReporter;
        rpt.NewRecord(['MagnetometerSensitivity_' p.Results.description]);
        rpt.AppendFigure(fig, sprintf('MagnetometerSensitivity %s', p.Results.description));
    end
    %%
    getSession;
    sess.addData('MagnetometerSensitivity', res, p.Results.description);    
end

